/*  --------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen -----------------------------
    File Name      : main.c
    Author         : Ray
    Version        : V1.0
    Date           : 2021-01-19
    Description    :
    ----------------------------------------------------------------------------------------------------
                                       All Rights Reserved
    ------------------------------------------------------------------------------------------------- */
/********************************************************************************

********************************************************************************/
#include <MyProject.h>

/********************************************************************************
    Internal Routine Prototypes
********************************************************************************/
void HardwareInit(void);
void SoftwareInit(void);
void VREFConfigInit(void);
void DebugSet(void);

uint8 data g_1mTick = 0;  ///< 1ms滴答信号，每隔1ms在SYSTICK定时器被置1，需在大循环使用处清零

/*  -------------------------------------------------------------------------------------------------
        Function Name : void DebugSet(void)
        Description   : 调试模式配置
        Input         : 无
        Output        : 无
    -------------------------------------------------------------------------------------------------*/
void DebugSet(void)
{
    #if defined (SPI_DBG_HW)      // 硬件调试模式
    Set_DBG_DMA(&HARD_SPIDATA);
    #elif defined (SPI_DBG_SW)    // 软件调试模式
    Set_DBG_DMA(spidebug);
    #elif defined (UART_DBG)      // 串口调试模式
    UARTDebug_Init();
    #endif
    #if defined (SPI_DBG_HW) && defined (SPI_DBG_SW)
#error Only one DBG mode can be selected
    #endif
    /* Observation signal Select */
    SetReg(CMP_CR3, DBGSEL0 | DBGSEL1, GP01_DBG_Conf);
    SetReg(CMP_CR3, CMPSEL0 | CMPSEL1 | CMPSEL2, GP07_DBG_Conf);
}



void main(void)
{
    /*上电等待*/
    uint16 PowerUpCnt = 0;

    GPIO_Init(); //设置 P1.0 作为函数段时长显示IO，可用于读取函数占用时间片

    for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++)
        ;

    /*ADC参考电压电压配置 */
    VREFConfigInit();

    /*硬件初始化*/
    HardwareInit();

    /*软件初始化*/
    SoftwareInit();

    /*总中断使能*/
    EA = 1;



    while (1)
    {
        /*基准电压采集*/
    	if(!mcCurOffset.OffsetFlag)
    	{ 
    		GetCurrentOffset();
    	}
    	else
    	{
    		/*电机控制状态机*/
    		MC_Control();
    	}	
    	if (g_1mTick)
    	{
    		TickCycle_1ms();
    		
    		g_1mTick = 0;
    	}

    }
}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : HardwareInit
    Description    : 硬件初始化
    Date           : 2020-04-12
    Parameter      : None
    ------------------------------------------------------------------------------------------------- */
void HardwareInit(void)
{

    /*比较器3初始化*/
    CMP3_Init(); //用于硬件过流比较保护,可通过 P2.6 引脚观察输出电压是否正确

    /*ADC初始化*/
    ADC_Init(); // 注意：ADC的初始化要放在DRV的初始化以前，否则会导致错误，因为DRV启动会自动触发ADC采样

    /*预驱初始化*/
    Driver_Init();

    /*运放初始化*/
    AMP_Init();

	#if(SPEED_MODE== PWMMODE)
	{
		Timer3_PWMInit();//PWM初始化使用TIMER3 gp11端口
	}
	#endif
	
	#if (SPEED_MODE == KEYMODE)
		KeyInit(); //按键控制 GP42端口
	#endif
	
//	 #if defined (SPI_DBG_HW)        // 硬件调试模式
//    {
//        SPI_Init();
//        Set_DBG_DMA(&HARD_SPIDATA);
//    }
//    #elif defined (SPI_DBG_SW)      // 软件调试模式
//    {
//        SPI_Init();
//        Set_DBG_DMA(spidebug);
//    }
//    #elif defined (UART_DBG)        // UART调试模式
//    {
//        UART2_Init();
//        SetPipe_DMA0(DRAM_UART2);
//    }
//    #endif
//		DebugSet();
//	  SPI_Init();
    /*LIN_Init();取消lin初始化*/
    //TIM3_Init();      /*串口模拟lin总线 用到的定时器*/
    /*比较器3中断配置*/
	CMP3_Interrupt_Init(); //CMP3中断配置
	/*TSD温度保护配置*/
	TSD_INIT();
    SYSTICK_Init();

}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : SoftwareInit
    Description    : 软件初始化，初始化所有定义变量，按键初始化扫描
    Date           : 2020-04-12
    Parameter      : None
    ------------------------------------------------------------------------------------------------- */
void SoftwareInit(void)
{

    /*程序中使用到的全局变量初始化*/
    MotorcontrolInit();

    /*初始状态机*/
    mcState = mcReady; //上电检测完电路后刹车

    /*错误状态标志位清0*/
    mcFaultSource = 0;

	  
}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : VREFConfigInit
    Description    : 配置VREF/VHALF输出
    Date           : 2020-04-12
    Parameter      : None
    VREF电压在芯片内部用于ADC的参考电压和DAC的参考电压
    VREFEN：
          0 -- 禁止内部VREF参考，如设置P3_AN[5]=1，外部参考从P3.5输入
                    1 -- 使能内部VREF参考，如设置P3_AN[5]=1，内部VREF参考送出至P3.5引脚，可接0.1～1uF电容提高VREF稳定性

    Q:如果使用内部VREF，不输出至P3.5，该引脚是否能作为普通IO使用？
    A:可以，但是采样精度不如”基准电压4.5V输出+电容“的模式
    ------------------------------------------------------------------------------------------------- */
void VREFConfigInit(void)
{
    /*REF&VHALF Config*/
    SetBit(P3_AN, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚

    if (HW_ADC_REF == 3.0)
    {
        SetBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
        ClrBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
    }
    else if (HW_ADC_REF == 4.0)
    {
        SetBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
        SetBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
    }
    else if (HW_ADC_REF == 4.5)
    {
        ClrBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
        ClrBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
    }
    else
    {
        ClrBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
        SetBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
    }

    SetBit(VREF_VHALF_CR, VREFEN | VHALFEN); //使能Vref 使能Vhalf
}
